package leetcode;

/**
 * 41. 缺失的第一个正数
 * <p>
 * 给你一个未排序的整数数组，请你找出其中没有出现的最小的正整数。
 * <p>
 *  
 * <p>
 * 示例 1:
 * <p>
 * 输入: [1,2,0]
 * 输出: 3
 * 示例 2:
 * <p>
 * 输入: [3,4,-1,1]
 * 输出: 2
 * 示例 3:
 * <p>
 * 输入: [7,8,9,11,12]
 * 输出: 1
 * <p>
 * 提示：
 * <p>
 * 你的算法的时间复杂度应为O(n)，并且只能使用常数级别的额外空间。
 *
 * @author: cuihao
 * @create: 2020-07-19 19:08
 **/
public class FirstMissingPositive {


    // 第几位 表示 第几个数是否存在 这是人能想出来的吗

    public int firstMissingPositive(int[] nums) {
        int n = nums.length;

        // 全部改为正数
        for (int i = 0; i < n; i++) {
            if (nums[i] <= 0) {
                // 这个数只要大于n就行
                nums[i] = n + 1;
            }
        }

        // 比n小的将对应的坐标改为负数
        for (int i = 0; i < n; i++) {
            int num = Math.abs(nums[i]);
            if (num <= n) {
                // 数字是从 1 开始的，坐标是从 0 开始的
                nums[num - 1] = -Math.abs(nums[num - 1]);
            }
        }
        for (int i = 0; i < n; i++) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }

        return n + 1;
    }
}
